#include "app_bt.h"
static int wait_ack(device_t *device);
int app_bt_setmaddr(device_t *device, char *maddr);
int app_bt_setBraudRate(device_t *device, BTBraudRate braud_rate);
/**
 * 设置蓝牙MAC地址(同一个组的多个设备MAC地址不同)
 * maddr: 4位十六进制字符串
 */
int app_bt_setmaddr(device_t *device, char *maddr)
{
    char cmd[100];
    sprintf(cmd, "AT+MADDR%s\r\n", maddr);
    write(device->fd, cmd, strlen(cmd));

    return wait_ack(device);
}
static int init_bt(device_t *device)
{
    app_serial_init(device);

    app_serial_setBlock(device, 0);
    tcflush(device->fd, TCIOFLUSH);
    if (app_bt_status(device) == 0)
    {
        log_debug("蓝牙已经初始化");
        // 修改蓝牙波特率
        app_bt_setBraudRate(device, BT_BAUD_115200);
        // 重置
        log_debug("蓝牙复位");
        app_bt_reset(device);
        sleep(2); // 等待蓝牙复位
       
    }
    app_serial_setBraudRate(device, BR_115200);
    tcflush(device->fd, TCIOFLUSH);
    // 设置蓝牙的Netid/MADDR/Name
    app_bt_rename(device, "wuk");
    app_bt_setNetId(device, "1235");
    app_bt_setmaddr(device, "0088");

    // 判断蓝牙是否可用， 如果不可用则返回-1
    if (app_bt_status(device) != 0)
    {
        log_error("蓝牙初始化失败");
        return -1;
    }

    // 将串口改为阻塞模式
    app_serial_setBlock(device, 1);
    tcflush(device->fd, TCIOFLUSH);

    log_debug("蓝牙初始化成功");
    return 0;
}
static int wait_ack(device_t *device)
{
    // 注意：需要等待一定时间，因为蓝牙模块需要一定时间来处理指令
    usleep(1000 * 50); // 50ms

    // 从设备中读取4个字节的数据
    char buf[4];  
    memset(buf, 0, 4);
    read(device->fd, buf, 4);
    // 清空串口接收缓冲区中的剩余数据
    tcflush(device->fd, TCIFLUSH);  // TCIFLUSH 只清空输入缓冲区
    
    // for (size_t i = 0; i < 4; i++)
    // {
    //     log_debug("buf[%d] = %x", i, buf[i]);
    // }
    
    // 如果读取的数据是“OK\r\n”则代表成功，返回0, 否则返回-1
    if (memcmp(buf, "OK\r\n", 4) == 0)
    {
        return 0;
    }

    return -1;
}

int app_bt_init(device_t *device)
{
    device->pre_write = app_bt_preWrite;
    device->post_read = app_bt_postRead;
    init_bt(device);
    return 0;
}
int app_bt_preWrite(char *data, int len)
{
    if (len < 6 || data[2] > 12)
    {
        return -1;
    }

    // 定义一个临时变量，用来存放数据
    char data_buffer[256];
    int data_len = 0;
    // 拼接蓝牙数据格式
    // AT+MESH<id><data>\r\n
    memcpy(data_buffer, "AT+MESH", 8);
    data_len += 8;
    memcpy(data_buffer + data_len, data + 3, data[1]); // id
    data_len += data[1];
    memcpy(data_buffer + data_len, data + 3 + data[1], data[2]);
    data_len += data[2];
    memcpy(data_buffer + data_len, "\r\n", 2);
    data_len += 2;

    // 将数据拷贝到回去
    memset(data, 0, len);
    memcpy(data, data_buffer, data_len);
    return data_len;
}

/**
 * 从设备读取数据后处理数据来满足网关应用的要求
 * 接收方得到数据（3 + [2]）：f1 dd 07 23 23 ff ff 41 42 43
    f1 dd : 固定的头部
    07： 之后数据的长度（5-16之间）
    23 23：对端（发送方）的MADDR
    ff ff: 我的MADDR或ffff(群发)
    41 42 43：发送的数据
 * 处理后的数据格式：conn_type id_len msg_len id msg
 */
// 用来处理蓝牙发送过来的临时数据缓冲区
static char data_buffer[256];
static int data_buffer_len = 0;
static char fix_header[2] = {0xF1, 0xDD};

static void remove_data_buff(int len)
{
    memmove(data_buffer, data_buffer + len, data_buffer_len - len);
    data_buffer_len -= len;
    memset(data_buffer + data_buffer_len, 0, len);
}
int app_bt_postRead(char *data, int len)
{
    int i = 0;
    memcpy(data_buffer + data_buffer_len, data, len);
    data_buffer_len += len;
    if (data_buffer_len < 8)
    {
        log_info("数据长度还不够,数据长度,%d,努力接收中。。。", len);
        return 0;
    }
    for (i = 0; i < data_buffer_len; i++)
    {
        if (memcmp(data_buffer + i, fix_header, 2) == 0)
        {
            // 移动到固定头部
            remove_data_buff(i);
            if (data_buffer_len < data_buffer[2] + 3)
            {
                return 0;
            }
            else
            {
                memset(data, 0, len);
                data[0] = 1;                                // 连接类型+1
                data[1] = 2;                                // id长度+1
                data[2] = data_buffer[2] - 4;               // 消息长度+1
                memcpy(data + 3, data_buffer + 3, data[1]); // id+1
                memcpy(data + 5, data_buffer + 7, data[2]); // 消息+1
                remove_data_buff(data[2] + 3);
                // 长度 = 连接类型 + id长度 + 消息长度 + id + 消息
                return data[2] + 5;
            }
        }
    }

    // 移除i个无用数据
    remove_data_buff(i);

    return 0;
}

/**
 * 测试蓝牙是否可用
 */
int app_bt_status(device_t *device)
{
   write(device->fd, "AT\r\n", 4);
    
    return wait_ack(device);
}

/**
 * 修改蓝牙名称
 */
int app_bt_rename(device_t *device, char *name)
{
    char cmd[100];
    sprintf(cmd, "AT+NAME%s\r\n", name);
    write(device->fd, cmd, strlen(cmd));

    return wait_ack(device);

}

/**
 * 设置波特率
 */
int app_bt_setBraudRate(device_t *device, BTBraudRate braud_rate)
{
    char cmd[100];
    sprintf(cmd, "AT+BAUD%c\r\n", braud_rate);
    write(device->fd, cmd, strlen(cmd));
    return wait_ack(device);
}

/**
 * 重置(修改的配置才生效)
 */
int app_bt_reset(device_t *device)
{
    write(device->fd, "AT+RESET\r\n", 10);
    return wait_ack(device);
}

/**
 * 设置组网id(同一个组的多个设备组网id相同)
 * net_id： 4位十六进制字符串
 */
int app_bt_setNetId(device_t *device, char *net_id)
{
    char cmd[100];
    sprintf(cmd, "AT+NETID%s\r\n", net_id);
    write(device->fd, cmd, strlen(cmd));

    return wait_ack(device);
}

